//#define _CRT_SECURE_NO_WARNINGS 1
//#include <iostream>
//using namespace std;
////多继承可能会导致菱形继承，而菱形继承又会有二义性，要解决二义性问题要用到虚基表，即在后面统一开辟空间共同管理数据，（通过原本位置存放的虚基表指针间接寻址偏移量）
//class A
//{
//public:
//	int _a;
//};
//
//class B : virtual public A//定义了vritual之后，原本在B和C中的A类型对象就会处理二义性，统一在别处（C++在对象的末端）新开辟空间处理冲突的元素
//{						  // 而原来B和C中A的位置会存放关于A中对象位置与自己相差的偏移量的地址，即该位置存放指针，间接寻址偏移量。从而在B和C处访问同一个A
//						  //而D是不用通过偏移量找的，因为开辟的空间是D管理的，是在B和C之外的空间，故B和C需要偏移量访问
//public:
//	int _b;
//};
//
//class C :virtual public A
//{
//
//public:
//	int _c;
//};
//
//class D :public B, public C
//{
//public:
//	int _d;
//};
//
//void test1()
//{
//	D d;
//	d._a = 0;
//	d.B::_a = 1;
//	d.C::_a = 2;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//
//	C c;
//	c._a = 10;
//	c._c = 20;
//
//	C* ptr1 = &c;
//	C* ptr2 = &d;		//在d对象处，指向C对象的位置，访问C里面对a的偏移量，得到_a，ptr2是c处的地址
                        //ptr2！=&d了，但他实际还是子类的指针，多态中是调用子类的重写的
//	//d._a = 10;
//	cout << ptr1->_a << endl;
//	cout << ptr2->_a << endl;
//	cout << ptr1->_c << endl;
//	cout << ptr2->_c << endl;
//}
//
////**************************************************************（上面）虚继承的虚基表寻址**************************************************
//
//
//
////隐藏问题
//
//namespace suzm
//{
//	class A
//	{
//	public:
//		void func()
//		{
//			cout << "A::func" << endl;
//		}
//	protected:
//		int _a;
//	};
//
//	class B:public A
//	{
//	public:
//		void func(int i)//问这是重载还是隐藏（隐藏又称重定义）
//		{
//			cout << "B::func" << endl;
//		}
//	protected:
//		int _a;
//		int _b;
//
//	};
//}
//
////明确：重载是在同一个作用域里面的，而A和B是在不同的类域中，不会构成重载，故是隐藏，隐藏的概念：对于同名变量以及同名函数（只看名字）优先显示派生类的
////若要访问基类的被隐藏的函数或变量，可以::指定访问
//
//
//
//
////************************************************************隐藏结束*************************************
//
//
